
#include "Registro.h"

using std::string;

Registro::Registro(int clave)
{
	this->clave = clave;
	posEnRegistro = 0;
}

Registro::~Registro() {
}

int Registro::getId()
{
	return clave;
}

int Registro::getLongitud()
{
	do_serializar();
	return bytes.size();
}

bool Registro::equals(Registro* registro)
{
	return this->clave == registro->clave;
}

void Registro::clonar(Registro* r)
{
	bytes.clear();
	bytes.insert(bytes.begin(), r->bytes.begin(), r->bytes.end());
	do_deserializar();
}

char* Registro::getComoArrayDeBytes()
{
	do_serializar();
	char* serializado = new char[getLongitud()];

	// limpio el char* de serializacion
	memset(serializado,0,getLongitud());
	// realizo la copia de a bytes
	memcpy(serializado, &bytes[0], bytes.size());

	return serializado;
}

void Registro::hidratar(char* reg, int longitud)
{
	bytes.clear();
	bytes.insert(bytes.begin(), reg, reg+longitud);
	do_deserializar();
}

void Registro::operator<<(const char c) {
	bytes.push_back(c);
}

void Registro::operator<<(const string s) {
	(*this) << (int) s.length();
	bytes.insert(bytes.end(), s.begin(), s.end());
}

void Registro::operator<<(const int i) {
	bytes.insert(bytes.end(), &((char*)&i)[0], &((char*)&i)[0]+4);
}

void Registro::operator>>(char &c) {
	c = *((char*) &posEnRegistro[0]);
	posEnRegistro++;
}

void Registro::operator>>(string &s) {
	s.clear();
	int longitud = 0;
	(*this) >> longitud;
	s.insert(s.begin(), posEnRegistro, posEnRegistro+longitud);
	posEnRegistro += longitud;
}

void Registro::operator>>(int &i) {
	i = *((int*) &posEnRegistro[0]);
	posEnRegistro += sizeof(int);
}

void Registro::do_serializar() {
	std::vector<unsigned char> backup(bytes);
	bool teniaContenido = !bytes.empty();

	bytes.clear();
	(*this) << (int) clave;
	this->serializar();

	if(teniaContenido && bytes.empty())
		bytes.insert(bytes.begin(), backup.begin(), backup.end());
}

void Registro::do_deserializar() {
	posEnRegistro = &bytes[0];
	(*this) >> (int&) clave;
	this->deserializar();
}

void Registro::serializar() {
	bytes.clear();
}

void Registro::deserializar() {
}
